在 CTF 的 Reverse / Pwn 題裡,會常常碰到要讀懂一小段 assembly 才能找到 flag 或漏洞。學會看組合語言、認識寄存器與 calling convention,就能在很多題目裡快攻破點關鍵。
rax, rbx, rcx, rdx, rsi, rdi, rbp, rsp, rip
等。eax, ebx...
)。r0-r12
/ x0-x30
。在做題前先確認 binary 的架構:file ./binary
cmp
/ test
+ je/jne/jg/jl
—— 通常是驗證邏輯mov
把結果放到某個地方mov [rbp-0x20], rax
、mov al, [rdi]
—— 對應到 buffer/字串讀寫,找 buffer overflow 點或字串比較。objdump -s -j .rodata
可查看。mov dst, src
:複製/讀寫。lea reg, [mem]
:load effective addresspush/pop
:stack 操作。call
/ ret
:函式呼叫/返回。cmp a,b
/ test a,b
:比較 / 檢查 0。je/jne/jg/jl/ja/jb
:條件跳轉(根據 flags)。xor reg, reg
:清零或 XOR;常見 xor rax, rax
。inc/dec
:+1 / -1。add/sub
:加減。這題給了一個反組譯程式問輸入0x2e0會回傳什麼
asm1:
<+0>: push ebp
<+1>: mov ebp,esp
<+3>: cmp DWORD PTR [ebp+0x8],0x3fb
<+10>: jg 0x512 <asm1+37>
<+12>: cmp DWORD PTR [ebp+0x8],0x280
<+19>: jne 0x50a <asm1+29>
<+21>: mov eax,DWORD PTR [ebp+0x8]
<+24>: add eax,0xa
<+27>: jmp 0x529 <asm1+60>
<+29>: mov eax,DWORD PTR [ebp+0x8]
<+32>: sub eax,0xa
<+35>: jmp 0x529 <asm1+60>
<+37>: cmp DWORD PTR [ebp+0x8],0x559
<+44>: jne 0x523 <asm1+54>
<+46>: mov eax,DWORD PTR [ebp+0x8]
<+49>: sub eax,0xa
<+52>: jmp 0x529 <asm1+60>
<+54>: mov eax,DWORD PTR [ebp+0x8]
<+57>: add eax,0xa
<+60>: pop ebp
<+61>: ret
我們順著程式邏輯看下去
<+10>
會判斷是否>0x3fb,答案為否所以不跳轉<+19>
會判斷是否不=0x280,答案為是,所以跳轉到<+29><+29>
eax = 0x2e0<+32>
eax = eax - 0xa = 0x2d6,然後跳到<+60>
所以最後回傳的就是eax的值就是0x2d6
以上就是今天的內容啦
想看更多,記得明天再來喔~